
library ieee;
use ieee.std_logic_1164.all;
use work.mystd.all;

entity MemoryInterface is 
	port (
    	clk			: in std_logic;		-- signal takta
    	reset       : in std_logic;		-- RESET signal
        
    	-- MAR (Memory Address Register)
        
    	loadMAR		: in std_logic;		-- signal kojim se azurira registar MAR
    	outMAR		: in std_logic;		-- signal kojim se sadrzaj registra MAR
        								-- propusta na adresnu magistralu
    	-- MBR (Memory Buffer Register)
       	
    	loadMBRproc	: in std_logic;		-- upravljacki signal kojim se sadrzaj MBR
       									-- puni odgovarajucim podatkom sa M3Bus
    	loadMBRmem	: in std_logic;		-- upravljacki signal kojim se sadrzaj MBR
       									-- puni podatkom sa DATA bus										
    	outMBRproc  : in std_logic;		-- upravljacki signal kojim se podatak procitan iz memorije
       									-- prosledjuje procesoru
    	outMBRmem	: in std_logic;	    -- upravljacki signal kojim se upisuje sadrzaj MBR upisuje u memoriju
       
    	-- magistrale
       
    	ABUS		: out bus32;		-- adresna magistrala								
    	DBUS		: inout bus32;		-- magistrala podataka
       	
    	M3Bus		: inout bus32		-- interna magistrala M3
	); 
     
end MemoryInterface;     
        

architecture MemoryInterface of MemoryInterface is
	signal MAR : bus32;		-- Memory Address Register
	signal MBR : bus32;		-- Memory Buffer Register
begin
      
	process
		variable prom : integer;
	begin   
		wait until clk = '1';
		 
		if(reset = '1') then
			-- reset ima najvisi prioritet        
			-- registre inicijalizujemo nulama
			MAR <= X"00_00_00_00";
			MBR <= X"00_00_00_00";
		else 
			if(loadMAR = '1') then
				MAR <= M3Bus;		-- upisujemo adresu sa M3Bus u registar MAR
			end if;
				
			if(loadMBRmem = '1') then
				MBR <= DBUS;		-- sa sistemske mag. DBUS u registar MBR
			end if;
				
			if(loadMBRproc = '1') then
				-- upisujemo podatak iz procesora u registar MBR
				MBR <= M3Bus;
			end if;
		end if;
	end process;
	
		    	
	ABUS <= MAR when outMAR = '1'		-- sadrzaj registra MAR na magistralu ABUS
			else (others => 'Z');
	
	DBUS <= MBR when outMBRmem = '1'	-- sadrzaj registra MBR na magistralu DBUS
			else (others => 'Z');
	
	M3Bus <= MBR when outMBRproc = '1'	-- sadrzaj registra MBR na internu mag. M3
			else (others => 'Z');
	
end MemoryInterface;








